// AI生成代码，未测试。20251106
#pragma once
#include "zero.h"
/*
PKCS7Padding

支持1-255字节的块大小
，适用于AES（16/24/32字节块）、SM4（16字节块）等现代加密算法，尤其在使用CBC、CFB等需要块对齐的分组模式

原文不符合分组长度是要填充至符合块大小的整数倍，填充值为填充字节数，即需要补充的字节个数是N，则填充N字节数据，且每个字节均为N的数据（填充值为0x0N）；
若数据长度正好为块大小的整数倍，则额外填充一个完整块（如16个0x10）‌
示例1：
原始：FF FF FF FF FF FF FF FF FF
填充：FF FF FF FF FF FF FF FF FF 06 06 06 06 06 06 06

示例2：
原始：FF FF FF FF FF FF FF FF
填充：FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07 07

示例3：
原始：FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
填充：FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

应用：
  PKCS7是当下各大加密算法都遵循的填充算法，且 OpenSSL 加密算法默认填充算法就是 PKCS7。主要原因如下：
  高安全性场景：如金融交易、敏感数据传输，因其填充规则可防止信息泄露（通过分析填充字节长度确保完整性）。
  通用数据加密：适用于文件加密、数据库字段加密等场景，支持灵活的块大小（1~255字节），兼容性强。
重点：
PKCS7填充规则通过以下机制防止信息泄露并确保数据完整性：
  （1）确定性的填充规则
PKCS7要求填充字节的值与填充长度严格对应（例如，缺3字节则填充3个0x03），解密时通过最后一个字节的值可明确识别填充长度并移除填充。这种确定性避免了填充内容歧义，防止攻击者通过篡改填充数据破坏完整性。
  （2）完整性校验机制
解密时需验证所有填充字节的值是否一致且符合块大小范围（如块大小为16时，填充值必须≤16）。若填充值无效（如0x11在16字节块中），则判定数据被篡改并拒绝处理，从而保护数据完整性。
  （3）防止基于填充长度的推断攻击
传统填充方式（如ZeroPadding）可能因数据尾部含零值导致填充误判，攻击者可借此推测明文内容或长度。而PKCS7的填充值与数据内容无关，统一规则降低了通过分析填充模式推断明文信息的风险。
  （4）强制完整块填充
即使明文长度符合分组大小的整数倍，PKCS7仍要求额外填充一个完整块（如16个0x10）。这使密文长度与明文长度的关联性被破坏，避免攻击者通过密文长度反推明文长度或结构。
①强制填充完整块可确保解密时无歧义地识别并移除填充，避免以下风险：
若数据末尾恰好包含类似填充的字节（如数据末尾有0x01），可能被误判为填充而截断，导致数据损坏。
示例：（块大小=4字节）：
明文："abcd"（长度4字节，已对齐块大小）。 PKCS7填充后："abcd<font color=#dd0000>\x04\x04\x04\x04</font><br/>"（追加4个0x04，总长度8字节）。 解密流程：读取最后一个字节0x04 → 移除最后4字节 →
恢复原始明文"abcd"。 若不填充：若数据本身为"abca"（末尾为0x01），可能被误判为填充1字节，导致错误移除。

②防止密文长度泄露明文信息
    强制填充完整块可破坏密文长度与明文的直接关联，避免攻击者通过分析密文长度推断明文特征：若明文长度正好是算法分组大小的整数倍时不填充，密文长度会比其他情况少一个块，攻击者可借此推测明文长度或结构，而强制填充后：所有密文长度均为块大小的整数倍，消除此类信息泄露。。
示例：
    明文1："12345678"（8字节，DES块大小）。
    明文2："1234567"（7字节）。
    未填充时：明文1加密后为1个块（8字节），明文2加密后为2个块（16字节，填充1字节）。
    攻击者观察密文长度：发现某些密文少一个块，可推断对应明文长度是块大小的整数倍。
③ 统一处理逻辑，简化实现
    强制填充使加密与解密逻辑完全对称，无需根据明文长度动态判断是否填充：
    加密时：无论明文是否对齐，统一添加填充块。解密时：只需检查最后一个字节确定填充长度，无需额外逻辑判断。
    优势：降低代码复杂度，减少因逻辑分支导致的漏洞（如未处理边界条件）。
④实际应用中的必要性
安全协议要求：如TLS/SSL、IPSec等强制使用PKCS7填充，确保协议层的数据完整性。
抵御填充预言攻击（Padding Oracle Attack）：强制填充使攻击者无法通过篡改填充字节观察解密程序的不同响应（如错误类型），从而无法推导密钥或明文。


PKCS5Padding

PKCS5Padding 支持大小为 8 个字节
的块。
填充方式同PKCS7 Padding， 补充长度为1-8字节。

原始：FF
填充：FF 07 07 07 07 07 07 07

原始：FF FF FF FF FF FF FF FF
填充：FF FF FF FF FF FF FF FF 08 08 08 08 08 08 08 08

应用：
例如DES等传统加密算法，常见于遗留系统或需兼容旧标准（如早期SSL/TLS协议）的场景。
固定块需求场景：在嵌入式设备或低资源环境中，因实现简单且块大小固定，适合硬件加密芯片等场景。
*/
class C_PKCS_PAD : public CBasicPad
{
public:
    C_PKCS_PAD(int iSize = 16) { m_iBlockSize = iSize; };
    virtual ~C_PKCS_PAD() {};

    virtual int Pad(BYTE *pData, int &iLen);
    virtual int UnPad(BYTE *pData, int &iLen);
};
